"""
Table类功能演示脚本

该脚本使用demo_data.csv数据文件，按功能模块展示Table类的所有方法用法。
"""
from dataframe import Table
import matplotlib.pyplot as plt

# ------------------------------ 1. 数据读写 ------------------------------
print("===== 数据读写演示 =====")
# 从CSV加载数据
table = Table()
table.load_from_csv('demo_data.csv')
print("加载CSV数据成功，前5行:\n", table.head())

# 保存为Excel
table.save_to_xlsx('demo_output.xlsx', index=False)
print("数据已保存到demo_output.xlsx\n")

# ------------------------------ 2. 数据查看与选择 ------------------------------
print("===== 数据查看与选择演示 =====")
print("列名列表:", table.get_columns())
print("总行数:", table.get_row_count())
print("前3行:\n", table.head(3))
print("后2行:\n", table.tail(2))
print("第2行数据:", table.get_row(1))
print("'salary'列数据:\n", table.get_column('salary'))
print("第3行'salary'值:", table.get_value(2, 'salary'))
print("数据基本信息:")
table.info()
print()

# ------------------------------ 3. 数据修改与转换 ------------------------------
print("===== 数据修改与转换演示 =====")
# 添加新列
table.add_column('bonus', [5000, 4000, 6000, 5500, 4500, 5800, 7000, 5200, 3800, 6200, 5000])
print("添加'bonus'列后的数据:\n", table.head())

# 重命名列
table.rename_columns({'salary': 'monthly_salary', 'bonus': 'annual_bonus'})
print("重命名列后的数据:\n", table.head())

# 转换数据类型
table.convert_column_type('age', float)
print("转换'age'列为float类型后:\n", table.get_column('age'))

# 插入列
table.insert(2, 'position', ['Engineer', 'Specialist', 'Senior Engineer', 'Manager', 'Specialist', 'Senior Engineer', 'Director', 'Engineer', 'Specialist', 'Senior Engineer', 'Engineer'])
print("插入'position'列后的数据:\n", table.head())

# 删除列
table.remove_column('is_active')
print("删除'is_active'列后的数据:\n", table.head())
print()

# ------------------------------ 4. 数据清洗 ------------------------------
print("===== 数据清洗演示 =====")
# 删除重复行
duplicate_count = table.get_row_count()
table.drop_duplicates()
print(f"删除重复行: {duplicate_count} -> {table.get_row_count()} 行")

# 检测缺失值
print("缺失值检测:\n", table.isna().head())

# 填充缺失值（当前数据无缺失值，演示语法）
table.fillna(value=0)
print()

# ------------------------------ 5. 数据操作 ------------------------------
print("===== 数据操作演示 =====")
# 筛选行
filtered = table.filter_rows("monthly_salary > 80000")
print("月薪大于80000的员工:\n", filtered)

# 排序数据
table.sort_by('monthly_salary', ascending=False)
print("按月薪降序排序后:\n", table.head())

# 数据采样
sampled = table.sample(n=3, random_state=42)
print("随机采样3行数据:\n", sampled)

# 数据转置
print("数据转置(前5行):\n", table.head().T())

# 重置索引
table.reset_index(drop=True)
print("重置索引后:\n", table.head())
print()

# ------------------------------ 6. 数据合并与连接 ------------------------------
print("===== 数据合并演示 =====")
# 创建部门数据
department_data = {
    'department': ['Engineering', 'Marketing', 'HR'],
    'location': ['Building A', 'Building B', 'Building C'],
    'headcount': [20, 15, 8]
}
department_table = Table(department_data)

# 合并数据
merged_table = table.merge_columns('department', department_table)
print("合并部门信息后:\n", merged_table.head())
print()

# ------------------------------ 7. 分组与聚合 ------------------------------
print("===== 分组与聚合演示 =====")
# 按部门分组
groups = table.group_by('department')
for dept, dept_table in groups.items():
    print(f"部门: {dept}, 员工数: {dept_table.get_row_count()}")

# 创建数据透视表
pivot = table.pivot_table(values='monthly_salary', index='department', aggfunc=['mean', 'max'])
print("部门薪资统计透视表:\n", pivot)
print()

# ------------------------------ 8. 统计分析 ------------------------------
print("===== 统计分析演示 =====")
# 薪资统计信息
print("薪资统计信息:", table.get_column_stats('monthly_salary'))

# 整体描述统计
print("整体描述统计:\n", table.describe())

# 相关系数
print("相关系数矩阵:\n", table.corr())

# 唯一值
print("部门唯一值:", table.unique_values('department'))
print()

# ------------------------------ 9. 数据可视化 ------------------------------
print("===== 数据可视化演示 =====")
# 绘制柱状图
table.plot_bar('department', title='各部门员工数', xlabel='部门', ylabel='员工数量')

# 绘制折线图
sorted_salary = table.sort_by('hire_date').iloc[:, [4, 2]]  # hire_date和monthly_salary
plt.figure()
sorted_salary.df.plot(x='hire_date', y='monthly_salary', kind='line', title='入职时间与薪资关系')
plt.show()

print("所有功能演示完成!")